---
title: 全局变量声明
---

在总览[章节](./overview/#语法介绍)我们提到，`ShaderLab` 总体语法骨架主要由3个层级模块嵌套组成：`Shader`、`SubShader`、`Pass`。每个层级模块都有对应的全局变量域，在全局变量域中可以声明4种全局变量：渲染状态(RenderState)，结构体，函数，以及单变量。

| 变量类型 | 描述 |
| :-- | :-- |
| 渲染状态 | 对应引擎 [RenderState](/apis/galacean/#RenderState) API，可以直接在 ShaderLab 中进行设置 |
| 结构体 | 作用等同于 GLSL 中的结构体，同时也用于 Varying 和 Attribute 变量声明定义，详见[文档](./entry/#attribute-和-varying-变量声明) |
| 函数 | 作用等同于 GLSL 中的全局函数 |
| 单变量 | 用于定义 Shader 中的 Uniform 变量 |

<Callout type="info">
### 全局变量作用域

与其他编程语言类似，`ShaderLab` 中的全局变量也有作用域和同名覆盖原则。简单来说，全局变量的作用和可见范围仅限于其声明的模块内部，即 `Shader`、`SubShader` 和 `Pass` 模块。而同名覆盖原则指的是如果在 `Pass` 模块内存在与其上级 `SubShader` 模块内同名的全局变量，则 `Pass` 内的全局变量会覆盖 `SubShader` 内的同名全局变量。`SubShader` 和上级 `Shader` 模块同名变量的覆盖原则同理。
</Callout>

## 渲染状态

包含混合状态(`BlendState`)，深度状态(`DepthState`)，模板状态(`StencilState`)，光栅化状态(`RasterState`)，渲染队列(`renderQueueType`)。

### BlendState

  ```glsl
  BlendState state {
    Enabled: bool;
    ColorBlendOperation: BlendOperation.XXX;
    AlphaBlendOperation: BlendOperation.XXX;
    SourceColorBlendFactor: BlendFactor.XXX;
    SourceAlphaBlendFactor: BlendFactor.XXX;
    DestinationColorBlendFactor: BlendFactor.XXX;
    DestinationAlphaBlendFactor: BlendFactor.XXX;
    ColorWriteMask: float // 0xffffffff
    BlendColor: vec4;
    AlphaToCoverage: bool;
  }
  ```
  <Callout>
  [BlendOperation](/apis/galacean/#BlendOperation) 和 [BlendFactor](/apis/galacean/#BlendFactor) 枚举等同引擎 API。
  </Callout>

### DepthState

  ```glsl
  DepthState state {
    Enabled: bool;
    WriteEnabled: bool;
    CompareFunction: CompareFunction.XXX;
  }
  ```
  <Callout>
  [CompareFunction](/apis/galacean/#CompareFunction) 枚举等同引擎 API
  </Callout>

### StencilState

  ```glsl
  StencilState state {
    Enabled: bool;
    ReferenceValue: int;
    Mask: float; // 0xffffffff
    WriteMask: float; // 0xffffffff
    CompareFunctionFront: CompareFunction.XXX;
    CompareFunctionBack: CompareFunction.XXX;
    PassOperationFront: StencilOperation.XXX;
    PassOperationBack: StencilOperation.XXX;
    FailOperationFront: StencilOperation.XXX;
    FailOperationBack: StencilOperation.XXX;
    ZFailOperationFront: StencilOperation.XXX;
    ZFailOperationBack: StencilOperation.XXX;
  }
  ```
  <Callout>
  [CompareFunction](/apis/galacean/#CompareFunction) 和 [StencilOperation](/apis/galacean/#StencilOperation) 枚举等同引擎 API
  </Callout>

### RasterState

  ```glsl
  RasterState state {
    CullMode: CullMode.XXX;
    DepthBias: float;
    SlopeScaledDepthBias: float;
  }
  ```

  <Callout>
  [CullMode](/apis/galacean/#CullMode) 枚举等同引擎 API
  </Callout>

### renderQueueType

```glsl showLineNumbers
RenderQueueType = Transparent;
RenderQueueType = Opaque;
RenderQueueType = AlphaTest;
```

以上各个渲染状态设置参考[文档](./renderState)。

## 结构体、函数

等同 `GLSL` 中的语法，下面代码段显示了分别声明在 Shader、SubShader 和 Pass 域内的函数和结构体：

```glsl showLineNumbers {5-9, 15-19, 25-29}
Shader "PlanarShadow" {

  ...
  // 作用域为整个 Shader 模块
  mat4 getJointMatrix(sampler2D smp, float index) {
    float base = index / renderer_JointCount;
    ...
    return mat4(m0, m1, m2, m3);
  }
  ...

  SubShader "Default" {
    ...
    // 作用域为 "Default" SubShader 模块
    vec3 ShadowProjectPos(vec4 vertPos) {
      vec3 shadowPos;
      ...
      return shadowPos;
    }
    ...

    Pass "0" {
      ...
      // a2v 结构体只对 Pass "0" 可见
      struct a2v {
        vec4 POSITION;
        vec4 JOINTS_0; 
        vec4 WEIGHTS_0;
      };
      ...
    }
  }
  ...
}

```

## 单变量

等同 `GLSL` 中的语法，`ShaderLab` 中所有 `Uniform` 变量使用全局单变量语法来声明。

```glsl showLineNumbers
[lowp/mediump/highp] mat4 uMVPMatrix;
```
